package com.tianjin.design.builder;

/**
 *
 * @author tianjin
 *
 * 2023年4月6日
 * TODO
 *
 * 创建型模式- 建造者模式
 * 1、将一个复杂的构建与其表示相分离，使得同样的构建过程可以创建不同的表示；
 * 2、用于基本组件不变，但是其组合经常变化的场景
 *
 * 使用场景：画小人。画小人的过程是固定的，需要画一个头、一个身体、两个胳膊、两条腿，但是其具体实现细节不同，有胖有瘦，有高有矮，但对于客户端来讲，只需要得到一个意向的小人。
 * 这就是说的将构建（画小人的过程）与其表示（高矮胖瘦）进行分离，使得同样的创建过程创建不同的表示
 * 是一个产品的内部表象与生产过程分隔开
 * 这是客户端只需要指定要构建的表象就可以了，具体构建的过程和细节不用关心
 *
 *
 * 3、所以构建者模式的实现思路是先确定产品的骨架，也就是需要确定产品的各个属性，然后定义固定的构建流程即可，客户端调用时只需要指定需要的具体属性信息就可以了
 * 4、代码思路
 * 		创建复杂对象使用，简单对象没有必要，所以这里我们把各个元素定义成对象
 * 		4-1 先定义构建细节 PeopleBuilder
 * 		4-2 构建的目的就是得到想要的最终对象，所以得定义小人  People
 * 		4-3 预定义构建可能的对象，例如黑眼睛大鼻子高个头红色小手小脚 OnePeopleBuilder
 * 		4-4 构建组件、最终构建对象都有了，接下来需要定义一个构建的固定流程，所以需要一个指挥者Director,
 * 		4-5 客户端通过指挥者获取对应复杂对象，只需要告诉指挥者我需要个什么小人就可以了,客户端使用
 * 	5、这里为了举例，在代码中定义固定OnePeopleBuilder，在实际用中，我觉得可以定义一个通用Builder，具体生成的属性细节交给客户端，也就是Builder中可以直接接受客户端的自定义属性
 */

public class Test {

	public static void main(String[] args) {

		Director director = new Director(new OnePeopleBuilder());
		People people = director.build();
		System.out.println(people.toString());
	}
}
